﻿using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using QLNhaThuoc.DTO;
using QLNhaThuoc.BL;
using QLNhaThuoc.MyClass;

namespace QLNhaThuoc
{
    public partial class Form_HoaDon : Form 
    {
        public Form_HoaDon()
        {
            InitializeComponent();
        }

        public HoaDon hoaDonInfo;
        public HoaDonControl hoaDonCtrl;
        NhanVienControl nhanVienCtrl;
        ThuocControl thuocCtrl;
        public bool isAdding = false;
        public bool isViewing = false;

        private void Form_HoaDon_Load(object sender, EventArgs e)
        {
            thuocCtrl = new ThuocControl();
            nhanVienCtrl = new NhanVienControl();

            if (isViewing == true)
            {
                XuatHoaDon();
                tbMaHD.ReadOnly = true;
                btSave.Enabled = false;
            }
        }

        private void XuatHoaDon()
        {
                dtpNgayXuat.Value = hoaDonInfo.NgayXuat;
                tbMaHD.Text = hoaDonInfo.MaHD.ToString();
                tbMaNV.Text = hoaDonInfo.MaNV;
                NhanVien nv = nhanVienCtrl.LayNhanVienTheoMa(hoaDonInfo.MaNV);
                tbTenNV.Text = nv.Ho + " " + nv.Ten;
                tbHoTenNM.Text = hoaDonInfo.TenNguoiMua;
                tbDiaChiNM.Text = hoaDonInfo.DiaChiNguoiMua;
                chbTheoDon.Checked = hoaDonInfo.TheoDon;
                dgvCTHD.AutoGenerateColumns = false;
                dgvCTHD.DataSource = hoaDonInfo.ctHoaDon;
        }

        private void btSave_Click(object sender, EventArgs e)
        {
            if (KiemTraDuLieuNhap() == true)
            {
                HoaDon info = new HoaDon();
                LayThongTinHoaDon(ref info);
                if (isAdding == true)
                {
                    if (hoaDonCtrl.KiemTraPK(info) == false)
                    {
                        hoaDonCtrl.ThemHD(info);
                    }
                }

                isAdding = false;
                isViewing = true;
                this.Close();
            }
        }

        private void btCancel_Click(object sender, EventArgs e)
        {
            this.Close();
        }

        private Thuoc thuoc;
        private void dgvCTHD_CellValidating(object sender, DataGridViewCellValidatingEventArgs e)
        {
            switch (dgvCTHD.Columns[e.ColumnIndex].Name)
            {
                case "MaThuoc":
                    if (String.IsNullOrEmpty(e.FormattedValue.ToString()))
                    {
                        dgvCTHD.Rows[e.RowIndex].Cells["MaThuoc"].ErrorText = "Bạn chưa nhập mã thuốc";
                        e.Cancel = true;
                    }
                    else
                    {
                        thuoc = thuocCtrl.LayThuocTheoMa(e.FormattedValue.ToString());
                        if (thuoc == null)
                        {
                            dgvCTHD.Rows[e.RowIndex].ErrorText = "Không tồn tại mã thuốc này";
                            e.Cancel = true;
                        }
                        else
                        {
                            dgvCTHD.Rows[e.RowIndex].Cells["MaThuoc"].Tag= thuoc.MaThuoc;
                        }
                    }
                    break;
                case "SoLuong":
                    if (String.IsNullOrEmpty(e.FormattedValue.ToString()))
                    {
                        dgvCTHD.Rows[e.RowIndex].Cells["SoLuong"].ErrorText = "Bạn chưa nhập số lượng";
                        e.Cancel = true;
                    }
                    else
                    {
                        int expectedSellQuantity = int.Parse(e.FormattedValue.ToString());
                        int actualSellQuantity = thuoc.Sell(expectedSellQuantity);
                        if(expectedSellQuantity > actualSellQuantity)
                        {
                            MessageBox.Show("So luong thuoc con la " + actualSellQuantity,
                                                                  "Thong bao");
                        }
                        dgvCTHD.Rows[e.RowIndex].Cells["SoLuong"].Tag = actualSellQuantity;
                    }
                    break;
            }
        }

        private void dgvCTHD_CellValidated(object sender, DataGridViewCellEventArgs e)
        {
            PhieuHelper.ValidateCell(dgvCTHD, e, thuoc);
        }

        private void LayThongTinHoaDon(ref HoaDon info)
        {
            //info.MaHD = tbMaHD.Text;
            info.NgayXuat = dtpNgayXuat.Value;
            info.MaNV = tbMaNV.Text;
            info.TenNguoiMua = tbHoTenNM.Text;
            info.DiaChiNguoiMua = tbDiaChiNM.Text;
            info.TheoDon = chbTheoDon.Checked;

            CTPhieuHelper helper = new CTHoaDonHelper
            {
                DataSource = dgvCTHD,
                //MaPhieu = int.Parse(tbMaHD.Text)
            };
            info.ctHoaDon = helper.TaoDanhSachChiTiet();
            info.ThanhTien = helper.ThanhTien;
        }

        private bool KiemTraDuLieuNhap()
        {
            if (tbMaNV.Text == "")
            {
                Utils.ShowError("Bạn chưa nhập mã nhân viên", "Thông báo");
                return false;
            }

            if (tbHoTenNM.Text == "")
            {
                Utils.ShowError("Bạn chưa nhập tên người mua", "Thông báo");
                return false;
            }

            if (tbDiaChiNM.Text == "")
            {
                Utils.ShowError("Bạn chưa nhập địa chỉ người mua", "Thông báo");
                return false;
            }

            if (dgvCTHD.Rows.Count == 1)
            {
                Utils.ShowError("Bạn chưa nhập chi tiết hóa đơn", "Thông báo");
                return false;
            }

            return true;
        }

        public delegate void formClosed();
        public event formClosed handle_formClosed;
        private void Form_HoaDon_FormClosed(object sender, FormClosedEventArgs e)
        {
            handle_formClosed();
        }

        private void tbMaNV_Validating(object sender, CancelEventArgs e)
        {
            PhieuHelper.KiemTraNhanVienTonTai(sender, e, nhanVienCtrl, errorProvider1, tbTenNV);
        }
    }
}
